package com.kfm.wiki.socket;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@Component
@ServerEndpoint("/ws/{token}")
@Slf4j
public class WebSocketServer {

    // 客户端 token
    private String token;

    private static Map<String, Session> map = new HashMap<>();

    /**
     *    连接
    */
    @OnOpen
    public void onOpen(Session session, @PathParam("token") String token){
        map.put(token, session);
        this.token = token;
        log.info("有新的连接， token：{}，sessionId: {}，当前连接数：{}", token, session.getId(), map.size());

    }

    /**
     * 关闭时
     */
    @OnClose
    public void onClose(Session session){
        map.remove(this.token);
        log.info("连接关闭， token: {}, sessionId: {}, 当前连接数：{}", this.token, session.getId(), map.size());
    }

    /**
     * 收到消息
     */
    @OnMessage
    public void message(String message, Session session){
        log.info("收到消息： {}， 内容： {}", this.token, message);
    }

    /**
     * 错误
     */
    @OnError
    public void onError(Session session, Throwable throwable){
        log.error("发生错误", throwable);
    }


    public void sendInfo(String message){
        for (String token : map.keySet()){
            Session session = map.get(token);
            try {
                session.getBasicRemote().sendText(message);
                log.info("推送消息， token: {}, 内容： {}", token, message);
            } catch (IOException e) {
                log.error("推送消息失败， token: {}, 内容： {}", token, message);
                e.printStackTrace();
            }
        }
    }
}
